package co.com.tye.presentation.backingBeans;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultMenuModel;
import org.primefaces.model.menu.DefaultSubMenu;
import org.primefaces.model.menu.MenuModel;

import co.com.tye.modelo.Usuario;
import co.com.tye.modelo.dto.GruposOpcionesDTO;
import co.com.tye.modelo.dto.OpcionesDTO;
import co.com.tye.presentation.businessDelegate.IBusinessDelegatorView;
import co.com.tye.utilities.FacesUtils;

@ManagedBean
@SessionScoped
public class LoginView {

	private InputText txtUsuario;
	private InputText txtContraseña;
	private String user = "";
	private String contraseña = "";
	private String rol = "";
	private Usuario usuario;
	List<OpcionesDTO> opciones;
	List<GruposOpcionesDTO> grupoOpciones;
	List<OpcionesDTO> opcionesTemporales = new ArrayList<OpcionesDTO>();

	private CommandButton btnIngresar;

	/*
	 * opciones del menu
	 */
	private MenuModel model;
	private DefaultSubMenu subMenu;

	@ManagedProperty(value = "#{BusinessDelegatorView}")
	private IBusinessDelegatorView businessDelegatorView;

	public String ingresar() {
		user = getTxtUsuario().getValue().toString().trim();
		contraseña = getTxtContraseña().getValue().toString();

		try {
			Usuario usuario = (user != null) ? businessDelegatorView
					.getUsuario(user) : null;
			if (usuario != null && usuario.getContra().equals(contraseña)) {

				FacesUtils.putinSession("user", user);
				rol = businessDelegatorView.getRol(usuario);
				if (rol.equals("universidad")) {
					opciones = businessDelegatorView.consultarOpciones(usuario
							.getUniversidad().getIduniversidad());
					grupoOpciones = businessDelegatorView
							.consultarNombresGrupos(usuario.getUniversidad()
									.getIduniversidad());
					crearMenu(rol);
					
				} else if (rol.equals("facultad")) {
					opciones = businessDelegatorView
							.consultarOpcionesFacultad(usuario.getFacultad()
									.getIdfacultad());
					grupoOpciones = businessDelegatorView
							.consultarNombresGruposFacultad(usuario
									.getFacultad().getIdfacultad());
					crearMenu(rol);
				} else if (rol.equals("programa")) {
					opciones = businessDelegatorView.consultarOpciones(usuario
							.getPrograma().getIdprograma());
					grupoOpciones = businessDelegatorView
							.consultarNombresGrupos(usuario.getPrograma()
									.getIdprograma());
					crearMenu(rol);
					
				}

				FacesContext.getCurrentInstance().addMessage("",
						new FacesMessage("Bienvenido a Edukometro"));
				return "goInitialMenu";
			} else {
				FacesContext.getCurrentInstance().addMessage("",
						new FacesMessage("Datos Incorrectos"));
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
			FacesContext.getCurrentInstance().addMessage("",
					new FacesMessage("Datos Incorrectos"));
		}

		return "fracaso";
	}

	public void crearMenu(String rol) {
		model = new DefaultMenuModel();

		DefaultMenuItem menuItemSalir = new DefaultMenuItem();
		menuItemSalir.setValue("Salir");
		menuItemSalir.setIcon("ui-icon-close");
		menuItemSalir.setCommand(cerrarSession());
		model.addElement(menuItemSalir);
		for (GruposOpcionesDTO gruposOpcionesDTO : grupoOpciones) {
			opcionesTemporales.clear();
			subMenu = new DefaultSubMenu(gruposOpcionesDTO.getNombreGrupo());
			for (OpcionesDTO opcionesDTO : opciones) {
				if (opcionesDTO.getIdgruposOpciones_GruposOpciones().equals(
						gruposOpcionesDTO.getIdgruposOpciones())) {
					opcionesTemporales.add(opcionesDTO);
				}
			}
			for (OpcionesDTO opcionDTO : opcionesTemporales) {
				DefaultMenuItem menuItem = new DefaultMenuItem();
				menuItem.setAjax(false);
				menuItem.setValue(opcionDTO.getNombreOpcion());
				menuItem.setTitle(opcionDTO.getNombreOpcion());
				menuItem.setUrl(opcionDTO.getLlaveDeAcceso());
				subMenu.addElement(menuItem);
			}
			model.addElement(subMenu);
		}
	}

	public String cerrarSession(){
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
		if(session!=null && session.getLastAccessedTime()<30000){
			session.invalidate();
		}
		return "/login.xhtml";
	}
	
	public List<OpcionesDTO> getOpciones() {
		return opciones;
	}

	public void setOpciones(List<OpcionesDTO> opciones) {
		this.opciones = opciones;
	}

	public List<GruposOpcionesDTO> getGrupoOpciones() {
		return grupoOpciones;
	}

	public void setGrupoOpciones(List<GruposOpcionesDTO> grupoOpciones) {
		this.grupoOpciones = grupoOpciones;
	}

	public String getRol() {
		return rol;
	}

	public void setRol(String rol) {
		this.rol = rol;
	}

	public InputText getTxtUsuario() {
		return txtUsuario;
	}

	public void setTxtUsuario(InputText txtUsuario) {
		this.txtUsuario = txtUsuario;
	}

	public InputText getTxtContraseña() {
		return txtContraseña;
	}

	public void setTxtContraseña(InputText txtContraseña) {
		this.txtContraseña = txtContraseña;
	}

	public CommandButton getBtnIngresar() {
		return btnIngresar;
	}

	public void setBtnIngresar(CommandButton btnIngresar) {
		this.btnIngresar = btnIngresar;
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getContraseña() {
		return contraseña;
	}

	public void setContraseña(String contraseña) {
		this.contraseña = contraseña;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public IBusinessDelegatorView getBusinessDelegatorView() {
		return businessDelegatorView;
	}

	public void setBusinessDelegatorView(
			IBusinessDelegatorView businessDelegatorView) {
		this.businessDelegatorView = businessDelegatorView;
	}

	public MenuModel getModel() {
		return model;
	}

	public void setModel(MenuModel model) {
		this.model = model;
	}

	public DefaultSubMenu getSubMenu() {
		return subMenu;
	}

	public void setSubMenu(DefaultSubMenu subMenu) {
		this.subMenu = subMenu;
	}

	public List<OpcionesDTO> getOpcionesTemporales() {
		return opcionesTemporales;
	}

	public void setOpcionesTemporales(List<OpcionesDTO> opcionesTemporales) {
		this.opcionesTemporales = opcionesTemporales;
	}

}
